import { BaseData } from '../base-data';
import { PageLink } from '../page/page-link';
import { SafeHtml } from '@angular/platform-browser';
import { ElementRef, EventEmitter, ViewContainerRef } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import { ActivatedRoute } from '@angular/router';
import {
  CellActionDescriptor,
  TableColumnDef,
  TableColumn,
  BaseTableColumn,
  ActionTableColumn,
  TableConfig,
  GroupActionDescriptor,
  HeaderActionDescriptor
} from './table-config.models';
import { ItemAction } from './table-data.models';
import { AnchorComponent } from '@shared/components/anchor.component';

export type ItemActionType = 'add';

/**
 * 表格组件接口
 */
export interface ITableComponent<T extends BaseData> {
  // ========== 配置与描述符 ==========
  tableConfig: TableConfig<T>; // 表格配置对象
  headerActionDescriptors: Array<HeaderActionDescriptor>; // 表头操作描述符数组
  groupActionDescriptors: Array<GroupActionDescriptor<T>>; // 批量操作描述符数组
  cellActionDescriptors: Array<CellActionDescriptor<T>>; // 单元格操作描述符数组

  // ========== 列定义 ==========
  actionColumns: Array<ActionTableColumn<T>>; // 操作列数组
  dataColumns: Array<TableColumn<T>>; // 数据列数组
  displayedColumns: string[]; // 显示的列键名数组

  // ========== 缓存 ==========
  headerCellStyleCache: Array<Record<string, unknown>>; // 表头单元格样式缓存
  cellContentCache: Array<SafeHtml>; // 单元格内容缓存（安全 HTML）
  cellTooltipCache: Array<string>; // 单元格提示信息缓存
  cellStyleCache: Array<Record<string, unknown>>; // 单元格样式缓存

  // ========== 状态控制 ==========
  selectionEnabled: boolean; // 是否启用行选择功能
  defaultPageSize: number; // 默认每页显示数量
  displayPagination: boolean; // 是否显示分页器
  pageSizeOptions: number[]; // 页面大小选项数组
  pageLink: PageLink; // 分页链接对象
  pageMode: boolean; // 是否为分页模式
  textSearchMode: boolean; // 是否为文本搜索模式
  timewindow: unknown | null; // 时间窗口对象
  dataSource: unknown; // 表格数据源
  isDetailsOpen: boolean; // 详情面板是否打开
  detailsPanelOpened: EventEmitter<boolean>; // 详情面板打开状态事件发射器

  // ========== 视图引用 ==========
  tableHeaderAnchor: AnchorComponent; // 表格头部锚点组件引用
  searchInputField: ElementRef; // 搜索输入框元素引用
  paginator: MatPaginator; // 分页器组件引用
  sort: MatSort; // 排序组件引用
  route: ActivatedRoute; // 路由参数服务
  viewContainerRef: ViewContainerRef; // 视图容器引用（用于动态加载组件）

  // ========== CRUD 操作 ==========
  addEnabled(): boolean; // 是否启用新增功能
  addItem($event: Event): void; // 新增项
  onItemUpdated(item: T): void; // 项更新后处理
  deleteItem($event: Event, item: T): void; // 删除单个项
  deleteItems($event: Event, items: T[]): void; // 批量删除项
  onItemAction(action: ItemAction<T>): void; // 处理项动作

  // ========== 数据管理 ==========
  clearSelection(): void; // 清除选择
  updateData(closeDetails?: boolean): void; // 更新数据
  columnsUpdated(resetData?: boolean): void; // 列更新后处理
  cellActionDescriptorsUpdated(): void; // 单元格操作描述符更新后处理

  // ========== 交互处理 ==========
  onRowClick($event: Event, item: T): void; // 行点击处理
  toggleDetails($event: Event, item: T): void; // 切换详情面板显示

  // ========== 搜索与过滤 ==========
  enterFilterMode(): void; // 进入过滤模式
  exitFilterMode(): void; // 退出过滤模式
  resetSortAndFilter(update?: boolean, preserveTimewindow?: boolean): void; // 重置排序和过滤

  // ========== 时间窗口 ==========
  onTimewindowChange(): void; // 时间窗口变化处理

  // ========== 样式与内容 ==========
  headerCellStyle(column: TableColumnDef<T>): Record<string, unknown>; // 获取表头单元格样式
  cellContent(item: T, column: TableColumnDef<T>, row: number): SafeHtml | string; // 获取单元格内容
  cellTooltip(item: T, column: TableColumnDef<T>, row: number): string; // 获取单元格提示
  cellStyle(item: T, column: TableColumnDef<T>, row: number): Record<string, unknown>; // 获取单元格样式
  clearCellCache(col: number, row: number): void; // 清除单元格缓存

  // ========== 跟踪函数 ==========
  trackByColumnKey(index: number, column: BaseTableColumn<T> | string): string; // 列跟踪函数
  trackByItemId(index: number, item: T): string; // 项跟踪函数

  // ========== 变更检测 ==========
  detectChanges(): void; // 手动触发变更检测
}

